home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Animation How-To
/
Animation How-to CD.iso
/
PLY
/
CHAPTER7
/
ASTEROID
/
PATH3.BAS
< prev
next >
Wrap
BASIC Source File
|
1994-01-01
|
5KB
|
220 lines
' PATH3.BAS - Asteroid Spline Path Creation Program
'
' "Magic Spline Fitting Code" translated from the C spline code in
' INTERACTIVE 3D COMPUTER GRAPHICS by L. Ammeraal,
' Chichester: John Wiley & Sons. (1988)
DECLARE SUB rotate (a!, b!, c!)
TYPE vector
x AS SINGLE
y AS SINGLE
z AS SINGLE
END TYPE
SCREEN 12
WINDOW (-3.2, -2.4)-(3.2, 2.4)
LINE (-1, -1)-(1, 1), , B
' left to right tunnels
s = 8
b = 1
LINE (-4, -4)-(4, 4), , B
' The individual control points.
DATA 0.0, 0.0, 16.0
DATA 0.0, 0.0, 8.0
DATA 0.0, 0.0, 4.0
DATA 0.0, 0.0, 2.0
DATA 0.0, 0.0, 1.5
DATA 0.1, 0.0, 1.0
DATA 0.0, 0.0, 0.5
DATA 0.5, 0.5, 0.5
DATA 0.0, 0.75, 0.0
DATA 0.5, 0.5, -0.5
DATA 0.75, 0.0, 0.0
DATA 0.5, -0.5, -0.5
DATA 0.0, 0.0, -0.75
DATA-0.5, -0.5, -0.5
DATA-0.75, 0.0, 0.0
DATA-0.5, 0.5, -0.5
DATA 0.0, 0.75, 0.0
DATA-0.5, 0.5, 0.5
DATA 0.0, 0.0, 0.75
DATA-0.5, -0.5, 0.5
DATA 0.0, -0.75, 0.0
DATA 0.5, -0.5, 0.5
DATA 0.5, 0.0, 0.0
DATA 1.0, 0.0, 0.0
DATA 2.0, 0.0, 0.0
DATA 4.0, 0.0, 0.0
DATA 8.0, 0.0, 0.0
DATA 16.0, 0.0, 0.0
DATA 32.0, 0.0, 0.0
m = 29
n = 10
scale = .9
count = 500
ahead = 5
DIM x(m), y(m), z(m)
DIM cam(count + ahead) AS vector
FOR i = 1 TO m
READ x(i), y(i), z(i)
NEXT i
k = 1
m = 28
OPEN "check" FOR OUTPUT AS #2
FOR i = 2 TO m - 1
' MAGIC SPLINE FITTING CODE
xA = x(i - 1): xB = x(i): xC = x(i + 1): xD = x(i + 2)
yA = y(i - 1): yB = y(i): yC = y(i + 1): yD = y(i + 2)
zA = z(i - 1): zB = z(i): zC = z(i + 1): zD = z(i + 2)
a3 = (-xA + 3! * (xB - xC) + xD) / 6!
a2 = (xA - 2! * xB + xC) / 2!
a1 = (xC - xA) / 2!
a0 = (xA + 4! * xB + xC) / 6!
b3 = (-yA + 3! * (yB - yC) + yD) / 6!
b2 = (yA - 2! * yB + yC) / 2!
b1 = (yC - yA) / 2!
b0 = (yA + 4! * yB + yC) / 6!
c3 = (-zA + 3! * (zB - zC) + zD) / 6!
c2 = (zA - 2! * zB + zC) / 2!
c1 = (zC - zA) / 2!
c0 = (zA + 4! * zB + zC) / 6!
'PRINT USING "< ##.####, ##.####, ##.#### >"; a3; b3; c3
'PRINT USING "< ##.####, ##.####, ##.#### >"; a2; b2; c2
'PRINT USING "< ##.####, ##.####, ##.#### >"; a1; b1; c1
'PRINT USING "< ##.####, ##.####, ##.#### >"; a0; b0; c0
'PRINT
w = 2
FOR j = first TO n
t = j / n
cam(k).x = scale * (((a3 * t + a2) * t + a1) * t + a0)
cam(k).y = scale * (((b3 * t + b2) * t + b1) * t + b0)
cam(k).z = scale * (((c3 * t + c2) * t + c1) * t + c0)
PRINT #2, USING "##.##### "; cam(k).x; cam(k).y; cam(k).z
k = k + 1
IF j = first THEN
PSET (x, z), y * 20 + 8
CIRCLE (x, z), .05, 2
ELSE
PSET (x, z), y * 20 + 8
END IF
NEXT j
first = 1
NEXT i
CLOSE #2
OPEN "orbiter.bat" FOR OUTPUT AS #1
k = 1
frame = 0
DO WHILE cam(k).x < 4
IF cam(k).z < 4 THEN
frame = frame + 1
count$ = RIGHT$("0000" + LTRIM$(STR$(frame)), 4)
PRINT #1, USING "echo define frx ##.###### >anim"; cam(k).x
PRINT #1, USING "echo define fry ##.###### >>anim"; cam(k).y
PRINT #1, USING "echo define frz ##.###### >>anim"; cam(k).z
up = 1
dimn = 1.5
norm1 = (frame - 20) / 40
norm2 = (frame - 190 - 20) / 40
' manually flip "up" to prevent scene reversal
IF frame > 78 AND frame < 119 THEN up = -1
IF frame > 158 THEN up = -1
inc = 0
IF frame < 20 THEN inc = 1
IF frame > 190 THEN inc = 2
PRINT #1, USING "echo define atx ##.###### >>anim"; cam(k + ahead).x
PRINT #1, USING "echo define aty ##.###### >>anim"; cam(k + ahead).y
PRINT #1, USING "echo define atz ##.###### >>anim"; cam(k + ahead).z
PRINT #1, USING "echo define upx ##.###### >>anim"; 0!
PRINT #1, USING "echo define upy ##.###### >>anim"; up
PRINT #1, USING "echo define upz ##.###### >>anim"; 0!
PRINT #1, USING "echo define inc # >>anim"; inc
PRINT #1, "\ply\polyray astr2.pi -o astr"; count$; ".tga "
PRINT #1,
a = cam(k).x
b = cam(k).y
c = cam(k).z
CALL rotate(a, b, c)
d = cam(k + ahead).x
e = cam(k + ahead).y
f = cam(k + ahead).z
CALL rotate(d, e, f)
' show it
LINE (a, c)-(d, f), 1 + co MOD 14
co = co + 1
END IF
k = k + 1
LOOP
CLOSE #1
SUB rotate (a, b, c)
pi = 3.14159
rad = pi / 180
'rotate
xrotate = 30
yrotate = 45
zrotate = 0
x0 = a
y0 = b
z0 = c
x1 = x0
y1 = y0 * COS(xrotate * rad) - z0 * SIN(xrotate * rad)
z1 = y0 * SIN(xrotate * rad) + z0 * COS(xrotate * rad)
x2 = z1 * SIN(yrotate * rad) + x1 * COS(yrotate * rad)
y2 = y1
z2 = z1 * COS(yrotate * rad) - x1 * SIN(yrotate * rad)
x3 = x2 * COS(zrotate * rad) - y2 * SIN(zrotate * rad)
y3 = x2 * SIN(zrotate * rad) + y2 * COS(zrotate * rad)
z3 = z2
a = x3
b = y3
c = z3
END SUB